package nexus.com.checkbox
{
	import nexus.com.checkbox.interfaces.ICheckBox;
	
	import flash.display.DisplayObjectContainer;
	import flash.events.MouseEvent;
	
	/**
	 * @author winnie
	 */	
	public class CheckGroup
	{
		private var checkList : Vector.<ICheckBox> = new Vector.<ICheckBox>();
		
		/**
		 *  <br> RadioGroup </br>
		 *  <br> 체크박스 버튼 그룹은 DisplayObject가 아닙니다. </br>
		 *  <br> 체크박스 버튼을 자동으로 제어하고자 하시는 분은 객체를 생성하여 버튼을 담아주세요. </br>
		 */
		public function CheckGroup( _checkList:Array = null )
		{
			if( _checkList == null ) return;
			
			var len:int = _checkList.length;
			for (var i:int = 0; i < len; i++) 
			{
				addCheckBoxAt( _checkList[ i ], i );
			}
		}
		
		
		
		/**
		 * @param idx 0~CheckBoxList length;
		 */		
		public function set selectedIndex( idx:Array ):void
		{
			idx.sort( Array.CASEINSENSITIVE );
			
			var len:int = checkList.length;
			for (var i:int = 0; i < len; i++) 
			{
				if( i == idx[ 0 ] )
				{
					idx.shift();
					checkList[ i ].select();
				}
				else checkList[ i ].deselect();
			}
		}
		
		
		/**
		 * @return 선택된 체크박스의 인덱스 : Array
		 */		
		public function get selectedIndex():Array
		{
			var selectedArr : Array = new Array();
			var len:int = checkList.length;
			for (var i:int = 0; i < len; i++) 
			{
				if( checkList[ i ].selected == true ) selectedArr.push( i );
			}
			
			return selectedArr;
		}
		
		/**
		 * [ 읽기전용 ]
		 * @return 등록된 체크박스의 갯수 
		 */		
		public function get length():int
		{
			return checkList.length;
		}
		
		
		/**
		 * @param btn ICheckBox 를 구현한 버튼
		 */		
		public function addCheckBox( btn : ICheckBox ):void
		{
			addCheckBoxAt( btn, checkList.length );
		}
		
		/**
		 * @param btn ICheckBox 를 구현한 버튼 제거
		 */
		public function removeCheckBox( btn : ICheckBox ):void
		{
			checkList.fixed = false;
			checkList.splice( checkList.lastIndexOf( btn ), 1 );
			checkList.fixed = true;
		}
		
		/**
		 * @param idx 버튼 인덱스
		 * @return ICheckBox 을 구현한 버튼 반환
		 */		
		public function getCheckBoxAt( idx:int ):ICheckBox
		{
			return checkList[ idx ];
		}
		
		
		/**
		 * @param label 선택할 버튼의 이름
		 * @return ICheckBox 를 구현한 체크박스 버튼
		 */		
		public function getCheckBoxAtLabel( label:String ):ICheckBox
		{
			var len:int = checkList.length;
			for (var i:int = 0; i < len; i++) 
			{
				if( checkList[i].label == label ) return checkList[i];
			}
			
			return null;
		}
		
		/**
		 * @param btn 끼워넣을 버튼
		 * @param idx 버튼의 인덱스 값
		 */		
		public function addCheckBoxAt( btn:ICheckBox, idx:int ):void
		{
			checkList.fixed = false;
			checkList.splice( idx, 0, btn );
			checkList.fixed = true;
			
			( btn as DisplayObjectContainer ).addEventListener( MouseEvent.CLICK, onCheckBoxClicked );
		}
		
		private function onCheckBoxClicked( e:MouseEvent ):void 
		{
			var btn : ICheckBox = e.currentTarget as CheckBox;
			
			if( btn.selected ) btn.deselect();
			else btn.select();
		}
	}
}









